Enrich Gamma、Richard Helm、Ralph Jhonson、Jhon Vlissides「オブジェクト指向における再利用のためのデザインパターン」1995
https://gyazo.com/e0c8b6acf11228549692b3a6c45c23f0
オブジェクト指向における再利用のためのデザインパターン | ガンマ, エリック, ジョンソン, ラルフ, ヘルム, リチャード, ブリシディース, ジョン, Gamma, Erich, Johnson, Ralph, Helm, Richard, Vlissides, John, 真一, 本位田, 和樹, 吉田 |本 | 通販 | Amazon GoF
目的 - 動機 - 適用可能性 - 構造 - 構成要素 - 協調關係 - 結果 - 實裝 - sample code - 使用例 - 關聯する pattern
生成に關する pattern
abstract factory
適用可能性
system を部品の生成、組み合はせ、表現の方法から獨立にすべき場合
部品の集合が複數存在して、その中の 1 つを選んで system を構築する場合
一群の關聯する部品を常に使用しなければならないやうに設計する場合
部品の class library を提供する際に、interface だけを公開して、實裝は非公開にしたい場合
code:mmd
classDiagram
AbstractFactory <|-- ConcreteFactory1
AbstractFactory <|-- ConcreteFactory2
AbstractFactory <-- Client : use
Client --> AbstractProductA : use
AbstractProductA <|-- ProductA1
AbstractProductA <|-- ProductA2
ConcreteFactory1 ..|> ProductA1
ConcreteFactory2 ..|> ProductA2
Client --> AbstractProductB : use
AbstractProductB <|-- ProductB1
AbstractProductB <|-- ProductB2
ConcreteFactory1 ..|> ProductB1
ConcreteFactory2 ..|> ProductB2
namespace Factory {
class AbstractFactory {
CreateProductA()
CreateProductB()
}
class ConcreteFactory1 {
CreateProductA()
CreateProductB()
}
class ConcreteFactory2 {
CreateProductA()
CreateProductB()
}
}
namespace ProductA {
class AbstractProductA
class ProductA1
class ProductA2
}
namespace ProductB {
class AbstractProductB
class ProductB1
class ProductB2
}
結果
具象 class を局所化する
部品の集合を容易に變更できるやうになる
部品閒の無矛盾性を促進する
新たな種類の部品に對應することが困難である
builder
適用可能性
多くの構成要素からなる object を生成する algorithm を、構成要素自體やそれらがどのやうに組み合はされるのかといふことから獨立にしておきたい場合
object の作成 process が、object に對する多樣な表現を認めるやうにしておかなければならない場合
code:mmd
classDiagram
Director o--> Builder : builder
Builder <|-- ConcreatBuilder
ConcreatBuilder ..> Product
note for Director "Construct() :\nfor all objects in structure {\nbuilder->BuildPart()\n}"
class Director {
Construct()
}
class Builder {
BuildPart()
}
class ConcreatBuilder {
BuildPart()
GetResult()
}
code:mmd
sequenceDiagram
participant aClient
participant aDirector
participant aConcreatBuilder
aClient -->> aConcreatBuilder : new ConcreatBuilder
aClient -->> aDirector : new Director(aBuilder)
aClient ->> aDirector : Construct()
aDirector ->> aConcreatBuilder : BuildPartA()
aDirector ->> aConcreatBuilder : BuildPartB()
aDirector ->> aConcreatBuilder : BuildPartC()
aClient ->> aConcreatBuilder : GetResult()
結果
Product object の內部表現の變更が可能になる
生成や表現のための code を局所化する
Product object の作成過程をより細かく controll できるやうになる
factory method
適用可能性
結果
prototype
適用可能性
結果
適用可能性
class に對して instance が 1 つしか存在してはならず、また、client が、その instance を公開された access point を通して access できるやうにしなければならない場合
唯一の instance が sub class 化により擴張可能で、また、client が、擴張された instance を code の修正なしに利用できるやうにしたい場合
code:mmd
classDiagram
note for Singleton "Instance() return uniqueInstance"
class Singleton {
static Instance()
SingletonOperation()
GetSingletonData()
static uniqueInstance
singletonData
}
結果
instance への access を制禦する
名前空閒を減らす
operation や內部表現を詳細化できる
instance の數を變へる事ができる
class operation よりも柔軟である
構造に關する pattern
adapter
適用可能性
結果
bridge
適用可能性
結果
composite
適用可能性
結果
decorator
適用可能性
結果
facade
適用可能性
結果
flyweight
適用可能性
結果
proxy
適用可能性
結果
振る舞ひに關する pattern
chain of responsibility
適用可能性
結果
command
適用可能性
結果
interpreter
適用可能性
結果
iterator
適用可能性
結果
mediator
適用可能性
結果
memento
適用可能性
結果
observer
適用可能性
結果
state
適用可能性
結果
strategy
適用可能性
結果
template method
適用可能性
結果
visitor
適用可能性
結果